Taller VaR y CVaR método de simulación Monte Carlo
--------------------------------------------------
Importar datos.
~~~~~~~~~~~~~~~
.. code:: r
datos = read.csv("Datos primer examen 01-2020.csv", sep = ";")
Matriz de precios.
~~~~~~~~~~~~~~~~~~
.. code:: r
precios = datos[,-1]
Matriz de rendimientos.
~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
rendimientos = matrix(, nrow(precios)-1, ncol(precios))
for(i in 1:ncol(precios)){
rendimientos[,i] = diff(log(precios[,i]))
}
:math:`S_0:`\ Precio actual de cada acción.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
s = tail(precios,1)
s = as.numeric(s)
s
.. raw:: html
- 3180
- 18800
- 24760
- 44700
Número de acciones del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
numero_acciones = c(180000,5000,12000,20000)
numero_acciones
.. raw:: html
- 180000
- 5000
- 12000
- 20000
Valor de mercado de cada acción.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
valor_mercado_acciones = numero_acciones*s
valor_mercado_acciones
.. raw:: html
- 572400000
- 9.4e+07
- 297120000
- 8.94e+08
Valor de mercado del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
valor_portafolio = sum(valor_mercado_acciones)
valor_portafolio
.. raw:: html
1857520000
Proporciones de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
proporciones = valor_mercado_acciones/valor_portafolio
proporciones
.. raw:: html
- 0.308152805891727
- 0.0506051078857832
- 0.159955209095999
- 0.481286877126491
:math:`\mu:` Rendimiento esperado de cada acción
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
mu = apply(rendimientos, 2, mean)
mu
.. raw:: html
- 0.00052818024892044
- 0.000817437518458556
- 0.000411972791855423
- 0.00146604550819807
:math:`\sigma:`\ Volatilidad de cada acción
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
volatilidades = apply(rendimientos, 2, sd)
volatilidades
.. raw:: html
- 0.0384381803599016
- 0.030438809306807
- 0.0239949256781827
- 0.0292898506777494
Matriz de coeficientes de correlación
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
correlacion = cor(rendimientos)
correlacion
.. raw:: html
A matrix: 4 × 4 of type dbl
1.0000000 | 0.3150607 | 0.2960306 | 0.3571087 |
0.3150607 | 1.0000000 | 0.4015795 | 0.3706462 |
0.2960306 | 0.4015795 | 1.0000000 | 0.3298657 |
0.3571087 | 0.3706462 | 0.3298657 | 1.0000000 |
Descomposición de Cholesky
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
cholesky = chol(correlacion)
cholesky
.. raw:: html
A matrix: 4 × 4 of type dbl
1 | 0.3150607 | 0.2960306 | 0.3571087 |
0 | 0.9490715 | 0.3248564 | 0.2719872 |
0 | 0.0000000 | 0.8982395 | 0.1511777 |
0 | 0.0000000 | 0.0000000 | 0.8807052 |
Preguntas
~~~~~~~~~
¿Cuál es el VaR y CVaR semanal con un nivel de confianza del 90% de cada una de las acciones y del portafolio de inversión?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
La frecuencia temporal de los rendimientos es semanal. Se usará
``dt=1/5`` porque se recomienda que :math:`\Delta t` sea pequeño. Así se
podrá realizar saltos diarios en el tiempo debido a que una semana tiene
cinco días bursátiles.
Así con saltos diarios de tiempo, para el **VaR semanal**, ``n=5``.
.. code:: r
n = 5
dt = 1/5
NC = 0.90
SImulación de precios diarios
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
iteraciones = 50000
st = array(dim = c(iteraciones, n+1, ncol(rendimientos)))
for(i in 1:ncol(rendimientos)){
st[,1,i] = s[i] # Con este for se está almacenando el precio actual de cada acción en la columna 1 de las matrices del array.
}
aleatorio_corr = vector()
for(k in 1:ncol(precios)){
for(i in 1:iteraciones){
for(j in 2:(n+1)){
aleatorio = rnorm(ncol(precios))
aleatorio_corr = colSums(aleatorio*cholesky)
st[i,j,k] = st[i,j-1,k]*exp((mu[k]-volatilidades[k]^2/2)*dt+volatilidades[k]*sqrt(dt)*aleatorio_corr[k])
}
}
}
Rendimientos semanales simulados de cada acción
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
El array ``st``\ tiene seis columnas (``n+1``), la última columna tiene
los precios simulados para una semana. Con esta columna se calcularán
los rendimientos **semanales** simulados.
.. code:: r
rend = matrix(,iteraciones,ncol(rendimientos))
for(i in 1:ncol(rendimientos)){
rend[,i] = st[,n+1,i]/s[i]-1 #Rendimientos semanales simulados de cada acción.
}
Rendimientos semanales simulados del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
rend_port = vector()
for(i in 1:nrow(rendimientos)){
rend_port[i] = sum(rend[i,]*proporciones)
}
VaR semanal individuales
~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_individuales_SM_percentil = vector()
for(i in 1:ncol(rendimientos)){
VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i])
}
VaR_individuales_SM_percentil
.. raw:: html
- 27250682.5694049
- 3580028.41405506
- 8942544.84875934
- 32208722.325042
VaR semanal del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
.. raw:: html
10%: 43906650.7840915
CVaR semanal individuales
~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
CVaR = vector()
for(i in 1:ncol(rendimientos)){
CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i])
}
CVaR
.. raw:: html
- 37265944.1349686
- 4850952.504194
- 12231487.8941014
- 43807904.8354661
CVaR semanal del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio)
CVaR_portafolio
.. raw:: html
481061.470750188
¿Cuál es el VaR y CVaR mensual con un nivel de confianza del 95% de cada una de las acciones y del portafolio de inversión?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
La frecuencia temporal de los rendimientos es semanal. Se usará
``dt=1/5`` porque se recomienda que :math:`\Delta t` sea pequeño. Así se
podrá realizar saltos diarios en el tiempo debido a que una semana tiene
cinco días bursátiles.
Así con saltos diarios de tiempo, para el **VaR mensual**, ``n=20``.
.. code:: r
n = 20
dt = 1/5
NC = 0.95
.. code:: r
iteraciones = 50000
st = array(dim = c(iteraciones, n+1, ncol(rendimientos)))
for(i in 1:ncol(rendimientos)){
st[,1,i] = s[i] # Con esto for se está almacenando el precio actual de cada acción en la columna 1 de las matrices del array.
}
aleatorio_corr = vector()
for(k in 1:ncol(precios)){
for(i in 1:iteraciones){
for(j in 2:(n+1)){
aleatorio = rnorm(ncol(precios))
aleatorio_corr = colSums(aleatorio*cholesky)
st[i,j,k] = st[i,j-1,k]*exp((mu[k]-volatilidades[k]^2/2)*dt+volatilidades[k]*sqrt(dt)*aleatorio_corr[k])
}
}
}
Rendimientos mensuales simulados de cada acción
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
El array ``st``\ tiene 21 columanas (``n+1``), la última columna tiene
los precios simulados para un mes. Con esta columna se calcularán los
rendimientos **mensuales** simulados.
.. code:: r
rend = matrix(, iteraciones, ncol(rendimientos))
for(i in 1:ncol(rendimientos)){
rend[,i] = st[,n+1,i]/s[i]-1 #Rendimientos mensuales simulados de cada acción.
}
Rendimientos mensuales simulados del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
rend_port = vector()
for(i in 1:nrow(rendimientos)){
rend_port[i] = sum(rend[i,]*proporciones)
}
VaR mensual individuales
~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_individuales_SM_percentil = vector()
for(i in 1:ncol(rendimientos)){
VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i])
}
VaR_individuales_SM_percentil
.. raw:: html
- 68425768.9393525
- 8715863.30371035
- 22371602.2623771
- 78647023.9143117
VaR mensual del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
.. raw:: html
5%: 109628306.897354
CVaR mensual individuales
~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
CVaR = vector()
for(i in 1:ncol(rendimientos)){
CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i])
}
CVaR
.. raw:: html
- 84333805.7509863
- 10876579.5113407
- 27763643.9843417
- 98184468.4514079
CVaR mensual del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio)
CVaR_portafolio
.. raw:: html
6043185.3876385
¿Cuál es el VaR y CVaR diario con un nivel de confianza del 99% de cada una de las acciones y del portafolio de inversión?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Como anteriormente se hallaron los precios simulados para 20 días (un
mes), no es necesario volverlos a calcularlos porque solo se necesitan
los precios simulados del día uno para obtener los rendimientos
simulados diarios. Estos valores están en la columna 2 del array
``st``.**
.. code:: r
NC = 0.99
Rendimientos diarios simulados de cada acción
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``st[,2,i]``\ son los precios simulados de cada acción para el día uno.
.. code:: r
rend = matrix(, iteraciones, ncol(rendimientos))
for(i in 1:ncol(rendimientos)){
rend[,i] = st[,2,i]/s[i]-1 #Rendimientos simulados de cada acción para el día 1.
}
Rendimientos diarios simulados del portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
rend_port = vector()
for(i in 1:nrow(rendimientos)){
rend_port[i] = sum(rend[i,]*proporciones)
}
VaR diario individuales
~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_individuales_SM_percentil = vector()
for(i in 1:ncol(rendimientos)){
VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i])
}
VaR_individuales_SM_percentil
.. raw:: html
- 22434687.8014924
- 2919082.71606842
- 7386222.59359142
- 26246899.3793198
VaR diario portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
.. raw:: html
1%: 36446602.6033561
CVaR diario individuales
~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
CVaR = vector()
for(i in 1:ncol(rendimientos)){
CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i])
}
CVaR
.. raw:: html
- 25585202.4378887
- 3353496.1402176
- 8392179.62141718
- 29944435.6810667
CVaR diario portafolio de inversión
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio)
CVaR_portafolio
.. raw:: html
1322962.98293428